Label Selector

개요

쿠버네티스에서 다양한 리소스가 연결되기 위해서는 서로를 명시해야 하는 경우가 많다.
이때 흔히 사용되는 방식이 바로 셀렉터이다.

리소스 간의 관계는 기본적으로 포착하는 주체와 타겟으로 설정된다.
이때 주체가 타겟을 포착하기 위해서는 타겟의 라벨을 보통 이용한다.
아무래도 라벨은 클러스터 내부에서 자체적으로 만들어주는 것들도 많고, 동적으로 설정할 수 있다는 유연성이 있어 각 리소스를 특정하고 선정하는데 장점이 많다.

Field Selector는 또 조금 다른 것이다.
이건 kubectl를 사용할 때 리소스를 조금 더 구체화하여 쿼리를 날릴 때 사용된다.

사용법

matchLabels

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

너무 많이 쓰는 것 같은 예제.
중간에 .spec.selector.matchLabels가 바로 셀렉터에 해당한다.
디플로이먼트는 어떤 파드를 관리하는가, 하면 셀렉터에 포착되는 파드를 관리할 것이다.
그 파드들은 key-value가 app: nginx인 라벨을 가질 것이다!
당연히 템플릿 안에는 template.labels.app:nginx가 들어있다.

matchExpressions

위와 같은 방식을 활용한다면, 사실 key와 value를 구분할 이유가 없다.
정확하게 저 쌍이 일치하는 것들만 포착하기 때문이다.
사실 위의 방식은 matchExpressions의 축약형이라고 볼 수 있다.
이 방식은 key value에 대해 상세한 조건을 설정할 수 있다.

  selector:
    matchExpressions:
	- key: app
	- operator: In
	- values:
	  - nginx

위와 정확히 일치하는 예시이다.
해석하자면 app이란 key에 nginx라는 value가 안에 있으면 포착하겠다는 것.
이 방식에서는 한 key에 여러 개의 value를 두는 것도 가능하고, 특정 value가 없는 것들을 포착하는 것도 가능하다.

만약 nginx가 아닌 놈들은 잡고 싶다면 operator에 NotIn을 넣으면 된다.

참고